{
struct task_struct *p;
- p = find_domain_by_id(pdb_ctx.domain);
+ if (pdb_ctx.domain == -2)
+ {
+ p = find_last_domain();
+ }
+ else
+ {
+ p = find_domain_by_id(pdb_ctx.domain);
+ }
+ if (p == NULL)
+ {
+ printk ("pdb error: unknown domain [0x%x]\n", pdb_ctx.domain);
+ strcpy (pdb_out_buffer, "E01");
+ pdb_ctx.domain = -1;
+ goto exit;
+ }
if (p->mm.shadow_mode)
pdb_ctx.ptbr = pagetable_val(p->mm.shadow_table);
else
unsigned long domain_ptbr;
p = find_domain_by_id(pdb_ctx.domain);
+ if (p == NULL)
+ {
+ printk ("pdb error: unknown domain [0x%x][0x%x]\n",
+ pdb_ctx.domain, pdb_ctx.process);
+ strcpy (pdb_out_buffer, "E01");
+ pdb_ctx.domain = -1;
+ goto exit;
+ }
if (p->mm.shadow_mode)
domain_ptbr = pagetable_val(p->mm.shadow_table);
else
put_task_struct(p);
pdb_ctx.ptbr = domain_ptbr;
- /* pdb_ctx.ptbr = pdb_linux_pid_ptbr(domain_ptbr, pdb_ctx.process); */
+ /*pdb_ctx.ptbr=pdb_linux_pid_ptbr(domain_ptbr, pdb_ctx.process);*/
}
pdb_ctx.valid = 0;
}
}
+exit:
/* reply to the request */
pdb_put_packet (pdb_out_buffer, ack);
p->domain = dom_id;
p->processor = cpu;
+ p->create_time = NOW();
memcpy(&p->thread, &idle0_task.thread, sizeof(p->thread));
}
+/* return the most recent domain created */
+struct task_struct *find_last_domain(void)
+{
+ struct task_struct *p, *plast;
+ unsigned long flags;
+
+ read_lock_irqsave(&tasklist_lock, flags);
+ plast = task_list;
+ p = plast->next_list;
+ while ( p != NULL )
+ {
+ if ( p->create_time > plast->create_time )
+ plast = p;
+ p = p->next_list;
+ }
+ get_task_struct(plast);
+ read_unlock_irqrestore(&tasklist_lock, flags);
+
+ return plast;
+}
+
+
void kill_domain_with_errmsg(const char *err)
{
printk("DOM%llu FATAL ERROR: %s\n", current->domain, err);
mm_segment_t addr_limit;
char name[MAX_DOMAIN_NAME];
+ s_time_t create_time;
struct thread_struct thread;
struct task_struct *next_list, *next_hash;
extern int final_setup_guestos(struct task_struct *p, dom0_builddomain_t *);
struct task_struct *find_domain_by_id(domid_t dom);
+struct task_struct *find_last_domain(void);
extern void release_task(struct task_struct *);
extern void __kill_domain(struct task_struct *p);
extern void kill_domain(void);